本文摘要(由AI生成):
本文主要介绍了插值和载荷相关的话题。插值是在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。在HyperGraph中,可以查询每一个点的数值,但是无法查询两个点中间的值,因为并不存在。如果确实需要,需要先进行插值。除了线性插值,HyperGraph里面还有样条插值等其它插值算法。在载荷施加方面,文章介绍了圆柱坐标系下施加载荷的方法,以及重力载荷和离心力载荷的施加方法。此外,文章还介绍了连续和离散插值的区别,以及如何通过例子来解释具体步骤。最后,文章还介绍了如何根据已知空间点的温度测量值施加所有节点的温度。
前面的42讲大部分都是关于网格的,这一讲介绍插值以及载荷相关的话题。载荷施加是有限元分析前处理的重要环节,大部分情况下施加载荷并不复杂,本文只讲那些略微有点棘手的问题。
首先科普一下什么是插值
百度百科上的插值定义:
在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。
Altair HyperGraph
说到插值,我首先想到的HyperGraph
例如在HyperGraph中定义一段正弦曲线:
图像给人的感觉是连续的,实际上呢?计算机并不懂什么连续, HyperGraph里面的所有函数和曲线也都是离散点。如果把数据点显示出来,效果就变成了这样。
Altair Compose绘制散点图的效果如下:
在HyperGraph里面可以查询每一个点的数值
但是无法查询两个点中间的值,因为并不存在。
如果希望计算一条Altair Radioss输出的力-位移曲线和实验测试之间的差别,同样也因为x坐标不一致而无法计算。
如果确实需要呢?需要先进行插值!
比如要计算0,0.03,0.06… …1.47,1.5这些点的值,具体的表达式是:
如果只要计算结果,不需要绘制曲线,可以在TextView里面写出表达式来
除了线性插值,HyperGraph里面还有样条插值等其它插值算法。
Altair HyperStudy里面创建响应使用的表达式和函数也都是通过templex语言实现的,不过目前的版本已经支持注册python和Compose编写的函数。
Altair Compose+python
Altair HyperWorks套件里的科学计算模块Compose也提供了各种插值功能,下图中是一段3维曲面插值的示例代码:
篇幅所限,这里对Compose就不展开介绍了,Compose有免费的版本,Altair也提供教程,有需要的可以发送邮件至info@altair.com.cn索取。
插值有1维/2维/3维/… …/n维。具体的数学算法和各种c/c++ /c#/python/Java源代码网上很容易找到。如果你对python的插值感兴趣,可以去scipy的网站看一下:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html
文中提到了不同插值选项的插值效果(下图)
Compose内置了python解释器,可以将CAE结果数据通过变量传给python,所以只要python能搞定的,都是可以通过Compose提供数据。
Altair HyperMesh
前面的铺垫有点长,本文主要讨论的是插值在HyperMesh软件中的应用,让我们赶紧开始吧。
如果载荷可以用一个连续函数来表达,那都是属于比较简单的情况。
比如施加一个正弦变化的压力:
首先需要一个局部坐标系,因为在局部坐标系下面写表达式容易。
然后给出载荷在局部坐标系下的表达式100*sin(0.01*z)
静水压力的施加也属于这种情况,只需要把相应的表达式替换为ρgh。
HyperMesh可以使用云图对结果进行直观显示,方便使用者进行检查。
还可以通过现有载荷插值得到新的载荷。
例如已知两侧压力如下图(左侧的载荷太小,无法看见图标):
插值得到的中间单元的值如下:
还有的时候需要在圆柱坐标系下施加载荷,比如轴承载荷,施加的方法如下:
Step1,创建圆柱坐标系。
Step2,根据角度,施加单位轴承载荷(这里属于cos函数,3.0的系数是为了使函数在加载范围内刚好为半个周期,2π/ω = π*2/3)。
Step3, 查看载荷汇总数据。
Step4, 根据总载荷的大小对单位载荷进行缩放(因为上一步施加的载荷总量是不对的)。
这一步在loadadd卡片里面添加一个关键字即可
在Altair SimLab里施加轴承载荷有一个专门的工具,使用起来更加简单,工具位于Applications /Special /Power Train/Bearing Pressure,界面如下:
对于下图中的漏斗型结构,当里面堆放粉末时会产生法向力和切向力,法向力很容易加载,但是切向力的加载似乎有点棘手(因为不同位置的切向力的方向都是不一样的)。
类似这种问题,可能编写一个简短的tcl脚本是最好的办法。
脚本如下:
由于在HyperMesh使用过程经常会需要一些tcl脚本,我专门录制了视频教学资料,预计在《HyperMesh宝典》全部50期连载完前可以发布。
当然,还有重力载荷和离心力载荷也是非常常见的,这类载荷通过关键字直接施加,可以在求解器的帮助文档或者培训资料中找到使用方法,就不在本文中介绍了。
如果要把有限元计算结果施加给另外的模型,这时网格有很多节点,用场进行插值精度会更高。
HyperMesh中有一个通用的创建和映射数据的工具——field。
field功能隐藏得比较深,以至于很多老用户都不知道这个工具。
Field工具位于Model Browser的右键菜单中
创建field时需要确定 Type 是连续场还是离散场
连续:适用于一片网格向另外一片网格插值的情况,这时HyperMesh可以基于源网格的形函数进行场的创建。
离散:适用于没有源网格的场合,比如从一些不规则点提取数据,再向新的网格插值
下面通过例子来解释具体步骤。
问题:已经有一个加载了力和边界位移约束的模型。然后有一套新网格,现在希望把旧的载荷和边界条件映射到新的网格上。
Step1,在Model Browser右击创建spc的field,命名为spc_field
设置如下:
Source entity list选所有spc
Step2,创建force的field,命名为force_field 设置如下:
Step3,显示目标网格,隐藏源网格
Step4,realize spc_field
在spc_field上右击选择Realize
在弹出对话框中设置如下并点击Apply:
在Model Browser里面可以看到生成了一个新的Load Collector,名字为displacementloads1
Step5,Realize Force_field
这时源网格上的spc和force都已经传递给了目标网格,但是force传递只保证载荷的分布,如果是压力或者温度,结果是对的,如果是力,用户需要自己再对总载荷进行缩放。具体操作和轴承载荷的step4相同。需要说明的一点是:对于比较复杂的空间网格,可以选择Nodal Force Balancing方法避免总载荷的不匹配(系统会自动计算相应的力和力矩)
在对离散的field进行realize的时候我们可以选择很多个插值选项。
Shape Function:使用单元的形函数
Shape Function and Proximity Mapping:在源网格内部使用单元的形函数,如果目标单元超出源网格以外(按照搜索容差搜不到)的按照最近点赋值。
Triangulation:系统会在后台构建一片三角形网格,并使用三角形单元的线性形函数进行插值
inverse distance weighting方法:使用线性形函数
Tolerance值用于确认目标点是在源单元的内部还是外部。
有时我们会先对整体模型进行分析,然后将应力较大的局部细化后再分析局部的应力。
下图中左侧是细化后的局部模型,右侧是应力云图:
接下来创建field并传递位移边界条件
Step1,从h3d文件创建field
Step2,realize field2
对话框设置如下:
Node选择所有节点,映射完成后得到的强制位移如下图
或者通过下拉菜单BCs > Contour查看z向强制位移云图
有了新的强制位移就可以计算新的细网格的模型了(过程省略)。
说明:对于目前的计算机性能来说一般直接在局部细化网格就可以了,并不需要这样截断后再插值,而且很多求解器本身就带有Global-Local的分析功能,插值过程在求解器内部完成。所以,本例的方法虽然很酷,但是用到的机会不多。
插值需要的结果文件也可以来自csv等文件。
csv文件是指用英文的逗号分隔各列的文本文件格式。
例如要把从cfd计算结果中得到的空间温度载荷映射到结构网格上(网格占据的空间位置相同但是网格和流体计算中使用的网格划分不一样)
Step1,载入结构网格
Step2,从csv文件创建field,命名为temp_field
Step3, Realize temp_field
Node选择所有要加载的结构节点。
Step4,在下拉菜单BCs >Contour检查载荷,结果如下:
如果选择的是2D网格,即使csv文件中的坐标是3D零件的坐标,也可以实现载荷的映射。结果如下:
有时只知道很少的几个空间点的温度测量值,需要根据这些值施加所有节点的温度,这种情况下如果已知温度在空间的变化是一个低阶的比较光顺的函数,可以使用morph中的形状函数进行空间插值。对于复杂的问题来说,由这几个已知点确定整个模型空间的温度,精度自然是不高的。而且其它几个工具也可以解决该问题,所以该方法做了解即可。
帮助文件HM-3640: Interpolating Loads Using Shapes中的例子讲述了完整的操作流程,本文就不再赘述了。
效果如下:
Field的功能不仅仅是映射载荷,其实几乎所有的数据都可以通过field来进行映射,比如下面的这个例子中映射2D单元的属性。
首先创建一个field
然后在新网格上进行映射
结果如下:
类似的,也可以映射2D单元的offset,材料纤维方向,以及其它任何数据(valuefromfile)
本讲到此就结束了,谢谢各位读者耐心读完~