浅谈有限元分析中的RBE2与RBE3单元
1.什么是RBE2和RBE3
在有限元分析中,经常会用到一种类似蜘蛛网形式的单元,大家对这种单元的叫法也都不一,比如rbe2、rbe3、多点约束、刚性单元、柔性单元、耦合等等,笔者这里还是习惯叫它rbe2和rbe3单元。这类单元一般用于施加边界条件和连接,这篇文章简要谈一谈rbe2和rbe3蜘蛛网结构的作用、区别以及使用场景的区别。
蜘蛛网结构
2.单元特性
- rbe2单元
rbe2单元就是常说的刚性单元,不同的求解器对刚性单元有不同的命令或关键字,例如在Optistruct和Nastran中以刚性单元以关键字rbe2给出。
在Abaqus中,刚性单元常用*coupling-*Kinematic给出
而在ANSYS中,刚性单元一般以cerig命令给出
不同求解器对于rbe2单元的底层数值算法可能略有差异,但其物理表现形式大致相同。都是将主节点与从节点构成一个无限刚度的区域,rbe2单元内部节点间没有任何相对运动,可以理解为整个rbe2单元形成了一个刚体,其主节点有6个自由度。由于rbe2单元其内部无限刚度的特性,在有限元模型中使用rbe2单元会增加局部刚度,但一般在小范围内使用rbe2单元几乎是不会对整体结构产生影响的。
- rbe3单元
rbe3单元一般也叫柔性单元,与rbe2一样,不同求解器有不同的关键字描述,在Nastran、Optistruct与ANSYS都用rbe3关键字进行描述,只是格式不同,ANSYS的rbe3关键字如下:
Optistruct的rbe3关键字如下:
而在abaqus中,rbe3单元一般用*COUPLING-*DISTRIBUTING关键字进行描述
与rbe2单元相反,rbe3单元主节点与从节点之间仅仅通过一定加权的方式进行载荷的传递,因此rbe3单元完全不会对模型提供任何额外的刚度,不会限制内部从节点之间的任何相对运动。
至此,两种单元的基本特性大致介绍完了,下面我们来讨论这两种单元的使用场景及原则。
3.使用场景
- 加载载荷:
两种单元都可以用于加载载荷, 例如加载集中力和力矩等。通过这两种单元可以将集中力和力矩传递到一定范围的区域。例如下图中需要在一定范围内施加10N的载荷,查看结构在该区域的变形情况,模拟车门内饰板的指压工况。这种情况一般都是用rbe2或者rbe3单元抓取该区域的节点,并将载荷施加在主节点上。但正如在上文中提到的,被rbe2单元抓取的区域会有无限刚度,从而增加局部模型的刚度,因此在这种工况下,rbe3单元相对更适合这种工况(但其实对于这种细小局部的计算,可能两种单元计算的结果差异也不会太大)。
在重型机械行业,有时候需要模拟某些设备在自重或一定加速度过载下,其安装座、支撑结构或整体骨架是否能满足强度要求。对于这种工况,最准确的做法肯定是将设备的刚度引入进整体模型,也就是需要将设备的主结构模型建出来,并装配至需要校核的支撑结构或整体骨架。但在实际操作时,一般很难实现,要么就是工作量会增加很多,要么就是设备都是由供应商提供,根本就拿不到其具体的内部结构甚至很多时候只知道其接口、重量和质心位置。这种情况下往往都会将设备简化为质量点再施加重力场或直接在其质心位置施加相当于其自重的集中力,那么这时候一般也会用到rbe2或rbe3单元。例如下图为某设备安装支撑座的强度校核。对于这类工况,其实不管用rbe2单元还是rbe3单元,都无法准确的模拟真实的物理状况,并且用这两种单元计算出来的结果可能相差非常远,那么在这种时候应该怎样抉择呢?根据笔者的经验,这类设备在设计的时候自身也会考虑自身的刚强度,特别是这类动辄几吨的设备,一般自身的刚度也非常强,如果用rbe3单元,相当于完全忽略了设备自身的刚度。而如果用rbe2单元,相当于把设备当成了一个纯刚性体,因此笔者一般遇到这种状况时,更多会选择rbe2单元,当然这并不是绝对的,具体还是要结合实际情况进行分析。
- 连接
起到连接作用的只能是rbe2单元,rbe3单元由于其内部从节点之间是相互自由的,因此不能起到连接作用。
例如封面的这张图rbe2单元起到的就是连接的作用,它模拟的是一个卡子卡在卡槽里的连接关系。这种情况rbe2单元的主节点可以是一个任意的自由节点,从节点一部分来自卡子,另一部分来自卡槽。但需要注意,用这种模拟方式就代表了并不关注卡子和卡槽局部细节的应力或应变,只是让其起到传递载荷的作用,因为使用rbe2单元进行连接后,卡子和卡槽局部的应力、应变等结果都是没有意义的。用这种方式可以很方便的模拟螺栓、铆钉以及点焊等连接关系,如下图所示为简单的螺栓模拟。
- 约束
可以将需要约束的节点通过rbe2或rbe3单元抓取到一起,然后在主节点上施加约束:
如果通过rbe2单元抓取在一起,并且在主节点上约束6个自由度的话,可以与直接在抓取的那些节点上施加全约束等效。这两种做法还是存在一个问题,就是被约束的区域会呈现无限刚度,这要具体使用的时候自行判断是否合理。如果使用rbe3单元抓取区域节点,则完全不会对模型产生任何额外的刚度,但约束区域有时候本来就应该给模型提供额外的刚度。因此具体在使用的时候还是应该根据实际的物理情形进行判断,因此答案不唯一。
通过rbe2和rbe3单元抓取节点进行约束还有一个很重要的应用。如下图,如果要实现模型整体有绕着某个轴转动的自由度,那么就需要通过rbe2或者rbe3抓取的方式,这样主节点有六个自由度,只需要释放主节点对应的自由度即可。
rbe2单元和rbe3单元除了以上提到的使用场景,还有许多其他的使用方法,这里就不一一列举了。通过以上的描述不难发现,其实关于什么时候使用rbe2单元,什么时候使用rbe3单元,最重要的还是需要弄清楚其本质的差异,那就是rbe2单元是将抓取的区域形成刚体,区域内部有无限刚度,而rbe3单元则不会为结构提供任何额外刚度,只是单纯通过加权的方式传递载荷。通俗来说就是一个会使局部刚度偏大,一个会使局部刚度偏小,那么有没有什么处理方式能够使局部刚度介于这两种单元,或者提供一种可以调节刚度参数的方式,从而能够有可能使计算结果更接近真实的物理状况呢?答案是有的,我们接下来讨论这个。
4.更精细的处理方式
不管是我们的rbe2单元还是rbe3单元,看起来都是蜘蛛网状的结构,都是一个主节点和许多的从节点通过线连接起来的表现形式。那么我们自然而然可以想到,既然都是主节点和从节点相连,那么为什么不能将每一个主节点和从节点之间通过梁单元进行连接呢?是的,这就是我们要做的,我们可以用梁单元形成一个蜘蛛网结构的连接方式,并且为梁单元设置单独的材料和横截面属性,如果模型需要进行模态或振动之类需要和质量相关的分析,那么可以把梁单元的密度设置得非常非常小。然后通过调整梁单元的材料的弹性模量或者梁单元的横截面大小,来调整由梁单元组成的蜘蛛网结构的内部刚度。至于刚度的参数怎么调整,这个就需要根据实际的问题和经验或者根据实验进行迭代,这种方法只是为蜘蛛网状单元提供了一种刚度可调整的方式。
由梁单元组成的蜘蛛网状单元
在大多数前处理器中,用这种方式去连接梁单元需要手动去连接,笔者这里给出一个在Hypermesh里面可以实现梁单元组成蜘蛛网状单元的二次开发程序:
proc create_prop_beamsec {} {
set beam_link_comp_name "beam_link_comp"
set beam_link_prop_name "beam_link_prop"
set beam_link_mat_name "beam_link_mat"
set comps_list [hm_entitylist comps name]
if {[expr [lsearch $comps_list $beam_link_comp_name] == -1]} {
*createentity comps name=$beam_link_comp_name
} {
*currentcollector components $beam_link_comp_name
}
set props_list [hm_entitylist props name]
if {[expr [lsearch $props_list $beam_link_prop_name] == -1]} {
*createentity props cardimage=PBEAM includeid=0 name=$beam_link_prop_name
}
set beamsects_list [hm_entitylist beamsects name]
if {[expr [lsearch $beamsects_list $beam_link_prop_name] == -1]} {
*createentity beamsects includeid=0 name=$beam_link_prop_name
}
set mat_list [hm_entitylist mats name]
if {[expr [lsearch $mat_list $beam_link_mat_name] == -1]} {
*createentity mats cardimage=MAT1 name=$beam_link_mat_name
}
*setvalue mats name=$beam_link_mat_name STATUS=1 1=2.1e5 3=0.3 4=1e-20
set beam_link_mat_id [hm_getvalue mats name=$beam_link_mat_name dataname=id]
set section_id [hm_getvalue beamsects name=$beam_link_prop_name dataname=id]
*setvalue props name=$beam_link_prop_name 3186=$section_id materialid=$beam_link_mat_id
set beam_prop_id [hm_getvalue props name=$beam_link_prop_name dataname=id]
*setvalue comps name=$beam_link_comp_name propertyid=$beam_prop_id
}
catch {
set main_node [*createentitypanel node "select the main node"]
set main_node_id [hm_info lastselectedentity node]
*clearmark vector 1
set vector_direction_string [hm_getdirectionpanel "select the direction"]
eval "set vector_direction $vector_direction_string"
*createvector 1 [lindex $vector_direction 0] [lindex $vector_direction 1] [lindex $vector_direction 2]
*clearmark nodes 1
*createmarkpanel nodes 1 "select the slave nodes"
set slave_node_list [hm_getmark nodes 1]
*clearmark nodes 1
create_prop_beamsec
foreach cur_node_id $slave_node_list {
*barelement $main_node_id $cur_node_id 1 0 0 0 0
}
*clearmark vector 1
}
复制以上程序至记事本,将后缀改为.tcl
运行生成的.tcl文件:
提示选择主节点,选择后并点击proceed:
选择一个方向,随意选择一个,并点击proceed:
选择从节点并点击proceed:
编辑
然后便自动生成了蜘蛛网状的结构,如果生成失败,可以在选择方向的那一步选择其他方向,从节点较多的时候,生成得可能会比较慢。